create or replace
PROCEDURE SP_ROLLBACK_REGUL_CANJE 
(
  CODETARJETA IN VARCHAR2
, CODECANJE in varchar2  
, PROCESOOK IN VARCHAR2 -- siempre me tiene que venir 1 es decir OK, porq yo envio una lista de canjes que no estan confirmados pero si llegaron a ser autorizados es decir su estado fue OK
, RESULTADO IN VARCHAR2  
, CODEESTACION IN VARCHAR2  
) AS 

-- 0 = ST_ERROR
-- 1 = ST_OK
contador number;
cantidad number;
idarticulo number;
idpremiocatalogo number;
idpremioinstant  number;
idclientepersona number;
idperiodoacumulacion number;
idstockalmacencatalogo number;
idsolcanjeinstantaneo number;
puntostotales number;
vaPuntosRequeridos number;

st_instantaneo_vale varchar2(255);
st_instantaneo_normal varchar2(255);
st_tipo_confirmacion char(1);

begin
  
  -- solamente debe realizarse rollback o cerrarse a los que su estado fue OK en la autorizacion del canje
  --if(PROCESOOK = '1') then
    st_tipo_confirmacion := '';
    cantidad := 0;
    idarticulo := -1;
    idpremiocatalogo := -1;
    idpremioinstant  := -1;
    idclientepersona := -1;
    idperiodoacumulacion := -1;
    idstockalmacencatalogo := -1;
    idsolcanjeinstantaneo := -1;
    puntostotales := 0;
    
    st_instantaneo_vale := 'N';
    st_instantaneo_normal := 'N';
    
    
    if (PROCESOOK = '0' and (RESULTADO is null or trim(RESULTADO) = '')) then 
      --significa que vamos a tener que confirmarlo, pero solo para hacerle el rollback
      st_tipo_confirmacion := 'R';
    elsif PROCESOOK = '1' then 
      if (RESULTADO = '0' or RESULTADO = '') then
        st_tipo_confirmacion := 'R';
      elsif (RESULTADO = '1') then
        st_tipo_confirmacion := 'Y';
      end if;
    end if;
    
    -- confirmando el proceso que ya llego
    update clpm_solic_canje_instantaneo
     set  st_confirmado_regularizacion = st_tipo_confirmacion,
          co_usuario_modificador = 'clubpgn',
          da_fecha_modificacion  =  sysdate
     where co_code_canje = codecanje
     and co_code_tarjeta_persona = codetarjeta
     and co_code_estacion = codeestacion;
     
     ----------------------------------------------------------------------------
     ----------------------------------------------------------------------------
     ----------------------------------------------------------------------------


     ----------------------------------------------------------------------------     
     select count(*) into contador       
     from clpm_solic_canje_instantaneo sc
          join clpr_premio_catalogo pc on pc.id = sc.co_premio
          join clpm_catalogo cat on pc.co_catalogo = cat.id
          join clpd_articulo pa on pa.id = pc.co_premio
          left outer join clpm_stock_almacen_catalogo sac on sac.co_premio = pc.id and sac.co_catalogo = pc.co_catalogo
          left outer join clpb_almacen a on sac.co_almacen = a.id 
          left outer join clpb_estacion e on a.co_estacion = e.id           
     where sc.co_code_canje = codecanje
       and co_code_tarjeta_persona = codetarjeta
       and (sc.co_code_estacion = codeestacion or sc.co_code_estacion is null)
       and (e.co_codigo_cofide = codeestacion  or e.co_codigo_cofide is null);     
     
     -- solamente debe realizarse rollback a los que fallaron para ellos
     if(st_tipo_confirmacion = 'R' and contador > 0) then
     
       -- obteniendo los datos del canje instant
       select sc.va_cantidad, sc.co_premio, sc.co_code_premio, sc.co_cliente_persona, sc.va_puntos_totales, sc.co_periodo_acumulacion,
       pa.id, pa.st_instantaneo_vale, pa.st_instantaneo_normal, sac.id, sc.id, pc.va_puntos_requeridos 
       
         into cantidad, idpremiocatalogo, idpremioinstant, idclientepersona, puntostotales, idperiodoacumulacion,
         idarticulo, st_instantaneo_vale, st_instantaneo_normal, idstockalmacencatalogo, idsolcanjeinstantaneo, vaPuntosRequeridos 

       from clpm_solic_canje_instantaneo sc
          join clpr_premio_catalogo pc on pc.id = sc.co_premio
          join clpm_catalogo cat on pc.co_catalogo = cat.id
          join clpd_articulo pa on pa.id = pc.co_premio
          left outer join clpm_stock_almacen_catalogo sac on sac.co_premio = pc.id and sac.co_catalogo = pc.co_catalogo
          left outer join clpb_almacen a on sac.co_almacen = a.id 
          left outer join clpb_estacion e on a.co_estacion = e.id           
       where sc.co_code_canje = codecanje
       and co_code_tarjeta_persona = codetarjeta
       and (sc.co_code_estacion = codeestacion or sc.co_code_estacion is null)
       and (e.co_codigo_cofide = codeestacion  or e.co_codigo_cofide is null);
       
       if(idpremiocatalogo is null) then
        idpremiocatalogo := -1;
       end if;
       
       if(idclientepersona is null) then
        idclientepersona := -1;
       end if;
       
       ----------------------------------------------------------------------------
       ----------------------------------------------------------------------------
       
       -- RESTAURANDO PTOS Y STOCK'S solo si es instantaneo normal      
       -- solamente aplica para instantaneos normales
      if(st_instantaneo_vale = 'N' and st_instantaneo_normal = 'Y') then
      
         update clpd_articulo 
         set 
          va_stock_actual = decode(va_stock_actual,null,cantidad,va_stock_actual + cantidad),
          co_usuario_modificador = 'clubpgn',
          da_fecha_modificacion  = sysdate
         where id = idarticulo;
       
         update clpr_premio_catalogo 
         set 
          va_canjes_limite_espejo  = decode(va_canjes_limite_espejo,null,cantidad,va_canjes_limite_espejo + cantidad),
          va_stock_catalogo_espejo = decode(va_stock_catalogo_espejo,null,cantidad,va_stock_catalogo_espejo + cantidad),
          co_usuario_modificador = 'clubpgn',
          da_fecha_modificacion  = sysdate
         where id = idpremiocatalogo;
      
      -- solamente aplica para instantaneos vales: NO, vales no manejan sotck ni canjes limites
      --elsif(st_instantaneo_vale = 'Y' and st_instantaneo_normal = 'N') then
      --update clpr_premio_catalogo set va_canjes_limite_espejo  = decode(va_canjes_limite_espejo,null,cantidad,va_canjes_limite_espejo + cantidad),
      --co_usuario_modificador = 'clubpgn', da_fecha_modificacion  = sysdate where id = idpremiocatalogo;     
      end if; 
      
      if (vaPuntosRequeridos > 0) then
            
         update clpm_puntos_periodo_cliente
         set va_puntos_actuales = decode(va_puntos_actuales,null,puntostotales,va_puntos_actuales + puntostotales),
             co_usuario_modificador = 'clubpgn',
             da_fecha_modificacion  = sysdate
         where co_cliente_persona = idclientepersona
         and co_periodo_acumulacion = idperiodoacumulacion
         and st_puntos_periodo_cliente = 'Y';
         
       end if;
       
         -- solamente aplica para instantaneos normales
        if(st_instantaneo_vale = 'N' and st_instantaneo_normal = 'Y') then
         update clpm_stock_almacen_catalogo 
         set			
          va_cantidad = decode(va_cantidad,null,cantidad,va_cantidad + cantidad),
          va_stock_catalogo_espejo = decode(va_stock_catalogo_espejo,null,cantidad,va_stock_catalogo_espejo + cantidad),
          co_usuario_modificador = 'clubpgn',
          da_fecha_modificacion  = sysdate
         where id = IDSTOCKALMACENCATALOGO;


         
         -- solamente aplica para instantaneos vales
         if(st_instantaneo_vale = 'Y' and st_instantaneo_normal = 'N') then    
          update clpm_vale_cliente_persona
          set st_vale_cliente_persona = 'N',
              co_usuario_modificador  = 'clubpgn',
              da_fecha_modificacion   =  sysdate      
          where co_cliente_persona = idclientepersona and da_fecha_vencimiento >= sysdate 
          and va_saldo > 0 and co_solicitud_canje_instantaneo = idsolcanjeinstantaneo 
          and co_premio = idpremiocatalogo;    
         end if;     
     end if;
     -- Guardando la incidencia del registro que fallo para ellos
     insert into clpm_incidencia_regul_canje (
				id, de_parametro, de_mensaje, de_error, 
				st_tipo_mensaje, da_fecha_creacion) values (		
       SEQ_INCIDENCIA_REGUL_CANJE.nextval, 
			 '[codetarjeta = '||codetarjeta||', codecanje='||codecanje||
       ', codeestacion='||codeestacion||']', 'El canje autorizado no fue confirmado '||
       'aplicando rollback (Regularizacion Canjes Instant).', resultado, 'E', sysdate );
     
   end if;
   
   ----------------------------------------------------------------------------
   ----------------------------------------------------------------------------
   ----------------------------------------------------------------------------
   ----------------------------------------------------------------------------
   
  --end if;
  
END SP_ROLLBACK_REGUL_CANJE;